#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
// 不阻塞等待且能回收子进程，不产生僵尸进程的两种方法
#include <iostream>

using namespace std ;


// 方法一 
/*void headler(int signum)
{
    //缺点是 ?  
    cout << "捕捉了信号:"  << signum << endl ;
    cout << "子进程回收完毕 " << endl ; 
    wait(NULL);
}


int main()
{
    signal(SIGCHLD,headler);
    
    pid_t tmp = fork();
    
    if(tmp == 0)
    {
        cout << "子进程开始退出 pid :" << getpid() << endl ; 
        sleep(3);
        exit(1);
    }
    
    while(true) sleep(1) ;

} */



//方法 2 

int main()
{
    signal(SIGCHLD,SIG_IGN);

    pid_t tmp = fork();

    if(tmp == 0)
    {
        cout << "子进程开始退出 pid :" << getpid() << endl ; 
        sleep(3);
        cout << "子进程已退出";
        exit(1);
    }

    while(true) sleep(1) ;
    return 0 ;
}